#

| Chapter 35 You Can't Quite Call This Editing |

## 35.7 offset: Indent Text

Do you have a printer that starts each line too close to the left margin? You might want to indent text to make it look better on the screen or a printed page. Here's a shell script that does that. It reads from files or standard input and writes to standard output. The default indentation is 5 spaces. For example, to send a copy of a file named graph to the lp printer, indented 12 spaces:

>     % offset -12 graph | lp

There are easier ways to do this (with awk (33.11), for instance). This script uses the Bourne shell case statement in an interesting way though, and that might give you ideas for other work.

>     #! /bin/sh

>     # GET INDENTATION (IF ANY) AND CHECK FOR BOGUS NUMBERS:
>     case "$1" in
>     -[0-9]|-[0-9][0-9]) indent="$1"; shift ;;
>     -*) echo "`basename $0`: '$1' isn't -number or is > 99." 1>&2; exit 1 ;;
>     esac

>     # SET DEFAULT:
>     case "$indent" in
>     "") indent=-5 ;;
>     esac

>     # BUILD THE SPACES FOR sed.
>     # FIRST case DOES MULTIPLES OF 10; SECOND case DOES SINGLE SPACES:
>     s="          "  # TEN SPACES
>     case "$indent" in
>     -?) ;;  # LESS THAN 10; SKIP IT
>     -1?) pad="$s" ;;
>     -2?) pad="$s$s" ;;
>     -3?) pad="$s$s$s" ;;
>     -4?) pad="$s$s$s$s" ;;
>     -5?) pad="$s$s$s$s$s" ;;
>     -6?) pad="$s$s$s$s$s$s" ;;
>     -7?) pad="$s$s$s$s$s$s$s" ;;
>     -8?) pad="$s$s$s$s$s$s$s$s" ;;
>     -9?) pad="$s$s$s$s$s$s$s$s$s" ;;
>     *)  echo "`basename $0`: Help! \$indent is '$indent'!?!" 1>&2; exit 1 ;;
>     esac

>     case "$indent" in
>     -0|-?0) ;;  # SKIP IT; IT'S A MULTIPLE OF 10
>     -1|-?1) pad="$pad " ;;
>     -2|-?2) pad="$pad  " ;;
>     -3|-?3) pad="$pad   " ;;
>     -4|-?4) pad="$pad    " ;;
>     -5|-?5) pad="$pad     " ;;
>     -6|-?6) pad="$pad      " ;;
>     -7|-?7) pad="$pad       " ;;
>     -8|-?8) pad="$pad        " ;;
>     -9|-?9) pad="$pad         " ;;
>     *)  echo "`basename $0`: Help! \$indent is '$indent'!?!" 1>&2; exit 1 ;;
>     esac

>     # MIGHT ADD expand FIRST TO TAKE CARE OF TABS:
>     sed "s/^/$pad/" $*

First, the script sets the indentation amount, like `-12` or `-5`, in the indent variable. Next, it builds a shell variable, pad, with just enough spaces to indent the text. One case checks the first digit of `$indent` to find out how many ten-space chunks of spaces to put in pad. The next case finishes the job with a few more spaces. A sed (34.24) command adds the spaces to the start of each line. If your lines have TABs in them, change the last line to use expand or pr -e -t (41.4) and pipe the result to sed:

>     expand $* | sed "s/^/$pad/"

- JP

35.6 Low-Level File Butchery with dd |  | 35.8 Centering Lines in a File